<?php

function my_uuid($median  = 3)   
{  
        $dex = "0123456789abcdef";  
        $mt = microtime();  
        list($msc, $ts) = explode(" ", $mt);  
        $uuid = dechex($ts); //时间戳精确到秒  
  
        $tm = date("Z");  
        $sign = 0;//时区标志  
        if($tm < 0) {  
            $sign = 1;  
            $tm = abs($tm);  
        }  
        $tm = intval($tm/3600);//计算时区，  
        $uuid .= $sign."".$dex[$tm];  
  
        $ip = $_SERVER["SERVER_ADDR"];//ip地址信息  
        $ip = explode(".", $ip);  
        $ip = array_map(function($v) {  
            $dex = "0123456789abcdef";  
            if(isset($v)) {   
                $idx = intval($v);  
                return "{$dex[($idx>>4)&0xf]}{$dex[$idx&0xf]}";  
            } else {return "00";}  
          
        }, $ip);  
  
      
        foreach($ip as $v) {  
            $uuid .= $v;  
        }  
  
        $msc = ltrim($msc, "0."); //毫秒  
        $uuid .= dechex($msc);  
  
        for($i = 0; $i < $median; $i++) {//随机数  
            $uuid  .= $dex[rand()&0xf];  
        }  
  
        return $uuid;  
 }  
 // $num = my_uuid(0);
 // echo $num;

function dump($var, $echo=true, $label=null, $strict=true) {
    $label = ($label === null) ? '' : rtrim($label) . ' ';
    if (!$strict) {
        if (ini_get('html_errors')) {
            $output = print_r($var, true);
            $output = "<pre>" . $label . htmlspecialchars($output, ENT_QUOTES) . "</pre>";
        } else {
            $output = $label . print_r($var, true);
        }
    } else {
        ob_start();
        var_dump($var);
        $output = ob_get_clean();
        if (!extension_loaded('xdebug')) {
            $output = preg_replace("/\]\=\>\n(\s+)/m", "] => ", $output);
            $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
        }
    }
    if ($echo) {
        echo($output);
        return null;
    }else
        return $output;
} 

function hu($cards)
{
    static $jiang = 0;         //   将牌标志，即牌型“三三三三二”中的“二”
    static $arr = '';          //   将牌标志，即牌型“三三三三二”中的“二”
    if (!remain($cards)) {     //   递归退出条件：如果没有剩牌，则和牌返回。
        return $arr;
    }
    $j = 1;
    for ($i = 1; !$cards[$j] && $i < 24; $i++) {  //   找到有牌的地方，i就是当前牌,   $card[$i]是个数
        $j = $i;
    }
//    echo "j= $j <br/>";                       //   跟踪信息
    if ($cards[$j] == 4) {                    //   4张组合(杠子)   如果当前牌数等于4张
        $arr[2][] = $j;
        $cards[$j] = 0;                       //   除开全部4张牌
        if (hu($cards)) {                     //   如果剩余的牌组合成功，和牌
            return $arr;
        }
        $cards[$j] = 4;                       //   否则，取消4张组合
    }
    if ($cards[$j] >= 3) {                    //   3张组合(大对)  如果当前牌不少于3张
        $arr[4][] = $j;
        $cards[$j] -= 3;                      //   减去3张牌
        if (hu($cards)) {                     //   如果剩余的牌组合成功，和牌
            return $arr;
        }
        $cards[$j] += 3;                      //   取消3张组合
    }
    if (!$jiang && $cards[$j] >= 2)  {        //   2张组合(将牌)  如果之前没有将牌，且当前牌不少于2张
        $jiang = 1;                           //   设置将牌标志
        $arr[1] = $j;
        $cards[$j] -= 2;                      //   减去2张牌
        if (hu($cards)) {                     //   如果剩余的牌组合成功，和牌
            return $arr;
        }
        $cards[$j] += 2;                      //   取消2张组合
        $jiang = 0;                           //   清除将牌标志
    }
    if ($j > 20) {                            //   “中发白”没有顺牌组合，不和
        return 0;
    }
    //   顺牌组合，注意是从前往后组合！
    //   排除数值为8和9的牌
    //   如果后面有连续两张牌
    if ($j % 10 != 8 && $j % 10 != 9 && $cards[$j + 1] && $cards[$j + 2]) {
        //   各牌数减1
        $cards[$j]--;
        $cards[$j + 1]--;
        $cards[$j + 2]--;
        $arr[3][] = [$j,$j + 1,$j + 2];
        //   如果剩余的牌组合成功，和牌
        if (hu($cards)) {
            return $arr;
        }
        //   恢复各牌数
        $cards[$j]++;
        $cards[$j + 1]++;
        $cards[$j + 2]++;
    }
    return 0;   //   无法全部组合，不和！
}


function hu3($cards, $jiang, $arr)
{
    if (!remain($cards)) {     //   递归退出条件：如果没有剩牌，则和牌返回。
        return $arr;
    }
    $j = 1;
    for ($i = 1; !$cards[$j] && $i < 24; $i++) {  //   找到有牌的地方，i就是当前牌,   $card[$i]是个数
        $j = $i;
    }
//    echo "j= $j <br/>";                       //   跟踪信息
    if ($cards[$j] == 4) {                    //   4张组合(杠子)   如果当前牌数等于4张
        $arr[2][] = $j;
        $cards[$j] = 0;                       //   除开全部4张牌
        if (hu3($cards, $jiang, $arr)) {                     //   如果剩余的牌组合成功，和牌
            return $arr;
        }
        $cards[$j] = 4;                       //   否则，取消4张组合
    }
    if ($cards[$j] >= 3) {                    //   3张组合(大对)  如果当前牌不少于3张
        $arr[4][] = $j;
        $cards[$j] -= 3;                      //   减去3张牌
        if (hu3($cards, $jiang, $arr)) {                     //   如果剩余的牌组合成功，和牌
            return $arr;
        }
        $cards[$j] += 3;                      //   取消3张组合
    }
    if (!$jiang && $cards[$j] >= 2)  {        //   2张组合(将牌)  如果之前没有将牌，且当前牌不少于2张
        $jiang = 1;                           //   设置将牌标志
        $arr[1] = $j;
        $cards[$j] -= 2;                      //   减去2张牌
        if (hu3($cards, $jiang, $arr)) {                     //   如果剩余的牌组合成功，和牌
            return $arr;
        }
        $cards[$j] += 2;                      //   取消2张组合
        $jiang = 0;                           //   清除将牌标志
    }
    if ($j > 20) {                            //   “中发白”没有顺牌组合，不和
        return 0;
    }
    //   顺牌组合，注意是从前往后组合！
    //   排除数值为8和9的牌
    //   如果后面有连续两张牌
    if ($j % 10 != 8 && $j % 10 != 9 && $cards[$j + 1] && $cards[$j + 2]) {
        //   各牌数减1
        $cards[$j]--;
        $cards[$j + 1]--;
        $cards[$j + 2]--;
        $arr[3][] = [$j,$j + 1,$j + 2];
        //   如果剩余的牌组合成功，和牌
        if (hu3($cards, $jiang, $arr)) {
            return $arr;
        }
        //   恢复各牌数
        $cards[$j]++;
        $cards[$j + 1]++;
        $cards[$j + 2]++;
    }
    return 0;   //   无法全部组合，不和！
}

function checkLiang($cards,$jiang=0,$arr='')
{
    $pai = [0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1];
    $arr = '';
    $jiang = 0;
    $arr1 = '';
    foreach ($pai as $k => $v) {
        if ($k==0 || $k==10 || $k==20) {
            continue;
        }
        if ($cards[$k] == 0) {
            if (isset($cards[$k+1]) && ($cards[$k+1] == 0)) {
                if (isset($cards[$k+2]) && ($cards[$k+2] == 0)) {
                    continue;
                }
            }
        }
        $cards[$k] += $v;
        $a = hu3($cards, $jiang, $arr1);
        if ($a) {
            $arr['res'][] = $k;
            $jiang = 0;
        }
        $cards[$k] -= $v;
        $arr1 = '';
    }
    return $arr;
}

//   检查剩余牌数
function remain($cards)
{
    $sum = 0;
    for ($i = 1; $i < 24; $i++) {
        $sum += $cards[$i];
    }
    return $sum;
}

$cards = $_GET['cards'];
$type = $_GET['type'];

if ($type == 1) {
    $data['res'] = checkLiang($cards) ;
}
if ($type == 2) {
    $data['res'] = hu($cards);  
}
echo json_encode($data);
?>